From: Florian Müllner Date: Thu, 16 May 2019 19:08:06 +0000 (+0200) Subject: dbusServices/notifications: Add a separate notification daemon X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~751^2^2~140 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=799bbdb5033f7b39b0af2057d530f2394334b0b7;p=gnome-shell.git dbusServices/notifications: Add a separate notification daemon Add a small service that exposes the Fdo notification API under the well-known name, and forwards any requests to the actual implementation in the shell. That way any app with permission to talk to org.freedesktop.Notifications will get exactly that, and nothing more. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/547 --- diff --git a/js/dbusServices/meson.build b/js/dbusServices/meson.build index c2c4d6392..2cca6544f 100644 --- a/js/dbusServices/meson.build +++ b/js/dbusServices/meson.build @@ -4,6 +4,7 @@ launcherconf.set('prefix', prefix) launcherconf.set('libdir', libdir) dbus_services = { + 'org.gnome.Shell.Notifications': 'notifications', } config_dir = '@0@/..'.format(meson.current_build_dir()) diff --git a/js/dbusServices/notifications/main.js b/js/dbusServices/notifications/main.js new file mode 100644 index 000000000..7944cd122 --- /dev/null +++ b/js/dbusServices/notifications/main.js @@ -0,0 +1,11 @@ +/* exported main */ + +const { DBusService } = imports.dbusService; +const { NotificationDaemon } = imports.notificationDaemon; + +function main() { + const service = new DBusService( + 'org.gnome.Shell.Notifications', + new NotificationDaemon()); + service.run(); +} diff --git a/js/dbusServices/notifications/notificationDaemon.js b/js/dbusServices/notifications/notificationDaemon.js new file mode 100644 index 000000000..c2d2ef6f9 --- /dev/null +++ b/js/dbusServices/notifications/notificationDaemon.js @@ -0,0 +1,80 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- +/* exported NotificationDaemon */ + +const { Gio, GLib } = imports.gi; + +const { loadInterfaceXML } = imports.misc.fileUtils; +const { ServiceImplementation } = imports.dbusService; + +const NotificationsIface = loadInterfaceXML('org.freedesktop.Notifications'); +const NotificationsProxy = Gio.DBusProxy.makeProxyWrapper(NotificationsIface); + +var NotificationDaemon = class extends ServiceImplementation { + constructor() { + super(NotificationsIface, '/org/freedesktop/Notifications'); + + this._autoShutdown = false; + + this._proxy = new NotificationsProxy(Gio.DBus.session, + 'org.gnome.Shell', + '/org/freedesktop/Notifications', + (proxy, error) => { + if (error) + log(error.message); + }); + + this._proxy.connectSignal('ActionInvoked', + (proxy, sender, params) => { + this._dbusImpl.emit_signal('ActionInvoked', + new GLib.Variant('(us)', params)); + }); + this._proxy.connectSignal('NotificationClosed', + (proxy, sender, params) => { + this._dbusImpl.emit_signal('NotificationClosed', + new GLib.Variant('(uu)', params)); + }); + } + + register() { + Gio.DBus.session.own_name( + 'org.freedesktop.Notifications', + Gio.BusNameOwnerFlags.REPLACE, + null, null); + } + + NotifyAsync(params, invocation) { + this._proxy.NotifyRemote(...params, (res, error) => { + if (this._handleError(invocation, error)) + return; + + invocation.return_value(new GLib.Variant('(u)', res)); + }); + } + + CloseNotificationAsync(params, invocation) { + this._proxy.CloseNotificationRemote(...params, (res, error) => { + if (this._handleError(invocation, error)) + return; + + invocation.return_value(null); + }); + } + + GetCapabilitiesAsync(params, invocation) { + this._proxy.GetCapabilitiesRemote(...params, (res, error) => { + if (this._handleError(invocation, error)) + return; + + invocation.return_value(new GLib.Variant('(as)', res)); + }); + } + + GetServerInformationAsync(params, invocation) { + this._proxy.GetServerInformationRemote(...params, (res, error) => { + if (this._handleError(invocation, error)) + return; + + invocation.return_value(new GLib.Variant('(ssss)', res)); + }); + } +}; diff --git a/js/dbusServices/org.gnome.Shell.Notifications.src.gresource.xml b/js/dbusServices/org.gnome.Shell.Notifications.src.gresource.xml new file mode 100644 index 000000000..ccf0e98a7 --- /dev/null +++ b/js/dbusServices/org.gnome.Shell.Notifications.src.gresource.xml @@ -0,0 +1,11 @@ + + + + main.js + notificationDaemon.js + dbusService.js + + misc/config.js + misc/fileUtils.js + +